feat(global-cli): pass the raw subcommand to the local CLI - #2262
Merged
Conversation
✅ Deploy Preview for viteplus-preview canceled.
|
Member
Author
How to use the Graphite Merge QueueAdd the label auto-merge to this PR to add it to the merge queue. You must have a Graphite account in order to use the merge queue. Sign up using this link. An organization admin has enabled the Graphite Merge Queue in this repository. Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue. This stack of pull requests is managed by Graphite. Learn more about stacking. |
Contributor
Native binary sizes (
|
| Artifact | Format | Base | PR | Change |
|---|---|---|---|---|
vp (Linux x64) |
Binary | 10.31 MiB | 10.31 MiB | 0 B (0.00%) |
vp (Linux x64) |
gzip -9 | 4.42 MiB | 4.42 MiB | +360 B (+0.01%) |
| NAPI (Linux x64) | Binary | 33.07 MiB | 33.07 MiB | 0 B (0.00%) |
| NAPI (Linux x64) | gzip -9 | 12.72 MiB | 12.72 MiB | 0 B (0.00%) |
vp (macOS ARM64) |
Binary | 7.64 MiB | 7.64 MiB | 0 B (0.00%) |
vp (macOS ARM64) |
gzip -9 | 3.84 MiB | 3.84 MiB | +1.20 KiB (+0.03%) |
| NAPI (macOS ARM64) | Binary | 40.50 MiB | 40.50 MiB | 0 B (0.00%) |
| NAPI (macOS ARM64) | gzip -9 | 16.97 MiB | 16.97 MiB | +78 B (+0.00%) |
vp (Windows x64) |
Binary | 8.34 MiB | 8.35 MiB | +2.00 KiB (+0.02%) |
vp (Windows x64) |
gzip -9 | 3.64 MiB | 3.64 MiB | +449 B (+0.01%) |
| NAPI (Windows x64) | Binary | 27.51 MiB | 27.51 MiB | 0 B (0.00%) |
| NAPI (Windows x64) | gzip -9 | 10.70 MiB | 10.70 MiB | 0 B (0.00%) |
| Trampoline (Windows x64) | Binary | 203.00 KiB | 203.00 KiB | 0 B (0.00%) |
| Trampoline (Windows x64) | gzip -9 | 97.91 KiB | 97.91 KiB | 0 B (0.00%) |
| Installer (Windows x64) | Binary | 4.44 MiB | 4.44 MiB | 0 B (0.00%) |
| Installer (Windows x64) | gzip -9 | 2.08 MiB | 2.08 MiB | 0 B (0.00%) |
wan9chi
force-pushed
the
feat/global-forward-subcommand
branch
from
July 27, 2026 10:40
42a80af to
de5c091
Compare
wan9chi
force-pushed
the
feat/global-forward-subcommand
branch
from
July 27, 2026 11:35
de5c091 to
dd3ac6c
Compare
wan9chi
force-pushed
the
feat/global-forward-subcommand
branch
from
July 27, 2026 11:55
dd3ac6c to
2c4e38a
Compare
wan9chi
force-pushed
the
feat/global-forward-subcommand
branch
from
July 27, 2026 12:03
2c4e38a to
4aa3c6c
Compare
wan9chi
force-pushed
the
feat/global-forward-subcommand
branch
2 times, most recently
from
July 27, 2026 12:35
311383d to
363be77
Compare
fengmk2
approved these changes
Jul 30, 2026
wan9chi
force-pushed
the
feat/global-forward-subcommand
branch
from
July 30, 2026 10:31
363be77 to
672e256
Compare
wan9chi
force-pushed
the
feat/global-forward-subcommand
branch
from
July 30, 2026 11:49
672e256 to
2b7dd18
Compare
Merge activity
|
## Motivation The local CLI runs a command under its canonical name, so it sees `fmt` whether the user wrote `vp fmt` or `vp format`. The spelling is gone by the time it arrives, and nothing downstream can recover it from argv. #2259, above this in the stack, needs it: a note that says "use `vpr fmt`" when the user wrote `vp format` is pointing at the wrong script. ## What this does The subcommand is read from argv before `normalize_args` can rewrite it, and travels to the local CLI as `VP_RAW_SUBCOMMAND`. It is passed *alongside* the command rather than in place of it: the command name stays canonical, because that string becomes the local CLI's `argv[0]` and has to name the command this process resolved. `vp help fmt` is the case where the two differ — the user wrote `help`, but the local CLI must still run `fmt --help`, since being handed `help --help` would print vp's top-level help instead of the formatter's. Nothing reads `VP_RAW_SUBCOMMAND` in this PR. `vite_plugins_skip_on_format` now runs both flavors, so the global one covers forwarding the alias.
graphite-app
Bot
force-pushed
the
fix/note-stderr
branch
from
July 30, 2026 12:45
7431205 to
813de11
Compare
graphite-app
Bot
force-pushed
the
feat/global-forward-subcommand
branch
from
July 30, 2026 12:46
2b7dd18 to
41cc9dd
Compare
graphite-app Bot
pushed a commit
that referenced
this pull request
Jul 30, 2026
…ipt (#2259) ## Motivation Built-in commands cannot be overridden, so `vp dev` runs the Vite+ dev server even in a project whose `dev` script does something else entirely (a framework wrapper, extra flags, a custom runner). Users regularly reach for the built-in when they meant the script — see #2243. Stacked on #2265 (notes go to stderr) and #2262 (the raw subcommand reaches this CLI). ## What this does When the user writes `vp <name>` and `<name>` is both a built-in and a `package.json` script: ``` note: You are running `vp dev` as a Vite+ built-in command. If you meant to run the dev npm script, use `vpr dev` instead. ``` The trigger is the name as written. It comes from `VP_RAW_SUBCOMMAND` when the global CLI provides it, since that is the only accurate source once a command has been resolved to its canonical name — `vp format` names the `format` script, not `fmt`. Otherwise it comes from the command line, where a rewrite is rejected: `vp help fmt` runs as `fmt --help`, and writing `help` is not writing the built-in. The only suppression is `VP_RUN`, set by the task runner (voidzero-dev/vite-task#570), since the user is then already on the `vpr` path. There is no TTY check: the note goes to stderr, so an agent capturing piped output still sees it while parsed stdout — `oxlint -f json`, `vitest --reporter=json`, `oxfmt --stdin-filepath` — stays intact. Script lookup walks up to the nearest `package.json`, the package `vp run` itself resolves a task from, so the note also applies from a subdirectory and deliberately stops there rather than climbing to a package `vpr` could not reach. Only the built-ins are covered. `run`/`cache` are the script path itself, `install` and friends legitimately trigger a project's `install` lifecycle scripts through the package manager, and `exec` names a binary rather than a task. `vp_build_cache` and `vp_build_cache_monorepo` are re-recorded: both define `"build": "vp build"` and run `vp build` directly, so they now show the note. Refs #2243
wan9chi
added a commit
that referenced
this pull request
Jul 30, 2026
…ipt (#2259) ## Motivation Built-in commands cannot be overridden, so `vp dev` runs the Vite+ dev server even in a project whose `dev` script does something else entirely (a framework wrapper, extra flags, a custom runner). Users regularly reach for the built-in when they meant the script — see #2243. Stacked on #2265 (notes go to stderr) and #2262 (the raw subcommand reaches this CLI). ## What this does When the user writes `vp <name>` and `<name>` is both a built-in and a `package.json` script: ``` note: You are running `vp dev` as a Vite+ built-in command. If you meant to run the dev npm script, use `vpr dev` instead. ``` The trigger is the name as written. It comes from `VP_RAW_SUBCOMMAND` when the global CLI provides it, since that is the only accurate source once a command has been resolved to its canonical name — `vp format` names the `format` script, not `fmt`. Otherwise it comes from the command line, where a rewrite is rejected: `vp help fmt` runs as `fmt --help`, and writing `help` is not writing the built-in. The only suppression is `VP_RUN`, set by the task runner (voidzero-dev/vite-task#570), since the user is then already on the `vpr` path. There is no TTY check: the note goes to stderr, so an agent capturing piped output still sees it while parsed stdout — `oxlint -f json`, `vitest --reporter=json`, `oxfmt --stdin-filepath` — stays intact. Script lookup walks up to the nearest `package.json`, the package `vp run` itself resolves a task from, so the note also applies from a subdirectory and deliberately stops there rather than climbing to a package `vpr` could not reach. Only the built-ins are covered. `run`/`cache` are the script path itself, `install` and friends legitimately trigger a project's `install` lifecycle scripts through the package manager, and `exec` names a binary rather than a task. `vp_build_cache` and `vp_build_cache_monorepo` are re-recorded: both define `"build": "vp build"` and run `vp build` directly, so they now show the note. Refs #2243
wan9chi
added a commit
that referenced
this pull request
Jul 31, 2026
Release vite-plus v0.2.7: Clearer commands and smoother setup. This release makes built-in and package-script collisions easier to navigate, adds concurrency control to `vp pack`, and smooths migrations and package-manager setup. ### Highlights - Guide users to `vpr <name>` when a built-in shares a name with a `package.json` script, preserve the exact command alias they typed, and avoid duplicate notes from task-spawned tools ([#2262](#2262), [#2259](#2259), [vite-task#570](voidzero-dev/vite-task#570)), by @wan9chi - Add `--concurrency` to `vp pack` to limit parallel Rolldown builds, and update tsdown `0.22.13` -> `0.22.14` and Vite DevTools `0.4.2` -> `0.4.5` ([#2233](#2233)), by @voidzero-guard[bot] - Add read-only Svelte rune globals to migrated Oxlint overrides, preventing false `no-undef` errors ([#2192](#2192)), by @naokihaba - Install package managers from npm tarballs with nonstandard top-level directories, fixing Yarn 1.22.19 installation ([#2264](#2264)), by @TheAlexLichter ### Fixes & Enhancements - Preserve machine-readable command output by sending informational CLI notes to stderr ([#2265](#2265)), by @wan9chi - Prevent the Oxc language server from crashing when contributors open the Vite+ workspace in VS Code ([#2245](#2245)), by @jong-kyung ### Docs - Document the full procedure for removing Vite+ commit hooks ([#2218](#2218)), by @TheAlexLichter - Document per-process and per-machine ways to disable Vite+ commit hooks without uninstalling them ([#2230](#2230)), by @TheAlexLichter - Clarify when to use built-in `vp` commands versus package scripts through `vp run` or `vpr`, including migration and agent guidance ([#2255](#2255)), by @wan9chi - Document GitLab CI/CD setup with the reusable `setup-vp` template ([#2258](#2258)), by @naokihaba ### Chore - Run Semgrep security scans on pull requests and pushes to `main` ([#2223](#2223)), by @Boshen - Re-enable Vitest browser-mode CLI snapshot coverage on every supported platform ([#2275](#2275)), by @wan9chi - Stabilize Windows CLI snapshot tests for interrupted installs and browser port fallback ([#2282](#2282)), by @wan9chi - Replace deprecated shared JavaScript and TypeScript VS Code settings with their current `js/ts.*` names ([#2246](#2246)), by @jong-kyung ### Bundled Versions | Tool | Version | Source | | --------------- | ---------- | ----------------------------------------------------------------------- | | vite | `8.1.5` | [`5e7fe12`](vitejs/vite@5e7fe12) | | rolldown | `1.2.0` | [`03e1e34`](rolldown/rolldown@03e1e34) | | tsdown | `0.22.14` | [npm](https://npmx.dev/package/tsdown/v/0.22.14) | | vitest | `4.1.10` | [npm](https://npmx.dev/package/vitest/v/4.1.10) | | oxlint | `1.75.0` | [npm](https://npmx.dev/package/oxlint/v/1.75.0) | | oxlint-tsgolint | `7.0.2001` | [npm](https://npmx.dev/package/oxlint-tsgolint/v/7.0.2001) | | oxfmt | `0.60.0` | [npm](https://npmx.dev/package/oxfmt/v/0.60.0) | ### Upgrade ```bash vp upgrade ``` **Full Changelog**: v0.2.6...v0.2.7 --- Merging this PR will trigger the release workflow. --------- Co-authored-by: voidzero-guard[bot] <278573678+voidzero-guard[bot]@users.noreply.github.com> Co-authored-by: wan9chi <dk4rest@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Motivation
The local CLI runs a command under its canonical name, so it sees
fmtwhetherthe user wrote
vp fmtorvp format. The spelling is gone by the time itarrives, and nothing downstream can recover it from argv.
#2259, above this in the stack, needs it: a note that says "use
vpr fmt" whenthe user wrote
vp formatis pointing at the wrong script.What this does
The subcommand is read from argv before
normalize_argscan rewrite it, andtravels to the local CLI as
VP_RAW_SUBCOMMAND.It is passed alongside the command rather than in place of it: the command
name stays canonical, because that string becomes the local CLI's
argv[0]andhas to name the command this process resolved.
vp help fmtis the case wherethe two differ — the user wrote
help, but the local CLI must still runfmt --help, since being handedhelp --helpwould print vp's top-level helpinstead of the formatter's.
Nothing reads
VP_RAW_SUBCOMMANDin this PR.vite_plugins_skip_on_formatnow runs both flavors, so the global one coversforwarding the alias.